package com.example.springboot.controller;
// 声明控制器所在的包路径

// 导入MyBatis-Plus的分页插件类，用于处理分页查询
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// 导入自定义的统一响应结果类
import com.example.springboot.common.Result;
// 导入宿舍房间实体类
import com.example.springboot.entity.DormRoom;
// 导入宿舍房间业务逻辑接口
import com.example.springboot.service.DormRoomService;
// 导入Spring MVC的REST控制器相关注解
import org.springframework.web.bind.annotation.*;
// 导入资源注入注解（由Spring框架提供，用于依赖注入）
import javax.annotation.Resource;
// 导入Java内置的ArrayList集合类，用于存储数据
import java.util.ArrayList;
/**
 * 宿舍房间管理控制器，处理宿舍房间相关的HTTP请求
 */
// 标识该类为RESTful风格的控制器，自动将方法返回值转换为JSON格式响应
@RestController// 定义控制器的基础请求路径，所有该控制器的接口路径都以/room开头
@RequestMapping("/room")
public class DormRoomController {
    // 通过@Resource注解注入宿舍房间业务逻辑服务实例，由Spring容器管理依赖
    @Resource
    private DormRoomService dormRoomService;

    /**
     * 添加宿舍房间接口
     * @param dormRoom 待添加的宿舍房间实体对象，通过HTTP请求体传递JSON数据
     * @return 统一响应结果：成功返回操作成功，失败返回错误信息
     */
    // 映射POST请求到/room/add路径，处理资源添加请求
    @PostMapping("/add") // 将HTTP请求体中的JSON数据绑定到DormRoom对象
    public Result<?> add(@RequestBody DormRoom dormRoom) {
        // 调用服务层方法执行添加操作，返回受影响的行数（1表示成功，非1表示失败）
        int i = dormRoomService.addNewRoom(dormRoom);
        // 根据受影响行数判断操作结果
        if (i == 1) {
            return Result.success();// 返回成功响应（默认消息）
        } else {
            return Result.error("-1", "添加失败");// 返回失败响应，附带错误码和消息
        }
    }

    /**
     * 更新宿舍房间信息接口
     * @param dormRoom 包含更新信息的宿舍房间实体对象，通过HTTP请求体传递
     * @return 统一响应结果：成功返回操作成功，失败返回错误信息
     */
    // 映射PUT请求到/room/update路径，处理资源更新请求
    @PutMapping("/update")// 将HTTP请求体中的JSON数据绑定到DormRoom对象
    public Result<?> update(@RequestBody DormRoom dormRoom) {
        // 调用服务层方法执行更新操作，返回受影响的行数
        int i = dormRoomService.updateNewRoom(dormRoom);
        if (i == 1) {
            return Result.success();
        } else {
            return Result.error("-1", "更新失败");
        }
    }

    /**
     * 删除宿舍房间接口
     * @param dormRoomId 待删除的宿舍房间ID，通过URL路径变量传递
     * @return 统一响应结果：成功返回操作成功，失败返回错误信息
     */
    // 映射DELETE请求到/room/delete/{dormRoomId}路径，{dormRoomId}为路径参数占位符
    @DeleteMapping("/delete/{dormRoomId}")
    // 将URL路径中的{dormRoomId}参数绑定到方法的dormRoomId参数
    public Result<?> delete(@PathVariable Integer dormRoomId) {
        int i = dormRoomService.deleteRoom(dormRoomId);
        // 调用服务层方法执行删除操作，返回受影响的行数
        if (i == 1) {
            return Result.success();
        } else {
            return Result.error("-1", "删除失败");
        }
    }

    /**
     * 分页查询宿舍房间接口
     * @param pageNum 当前页码，默认值为1（第一页）
     * @param pageSize 每页显示的记录数，默认值为10条
     * @param search 搜索关键词（可选参数，默认空字符串）
     * @return 统一响应结果：成功返回分页数据，失败返回错误信息
     */
    // 映射GET请求到/room/find路径，处理分页查询请求
    @GetMapping("/find") // 从请求参数中获取分页和搜索条件，设置默认值
    public Result<?> findPage(@RequestParam(defaultValue = "1") Integer pageNum,
                              // 当前页码
                              @RequestParam(defaultValue = "10") Integer pageSize,
                              // 每页记录数
                              @RequestParam(defaultValue = "") String search) {
                              // 搜索关键词
        // 调用服务层方法执行分页查询，返回Page对象（包含数据列表和分页信息）
        Page page = dormRoomService.find(pageNum, pageSize, search);
        if (page != null) {
            return Result.success(page);
        } else {
            return Result.error("-1", "查询失败");
        }
    }

    /**
     * 统计未住满宿舍数量接口（首页顶部信息）
     * @return 统一响应结果：成功返回空宿舍数量，失败返回错误信息
     */
    // 映射GET请求到/room/noFullRoom路径，处理统计请求
    @GetMapping("/noFullRoom") // 调用服务层方法获取未住满的宿舍数量
    public Result<?> noFullRoom() {
        int num = dormRoomService.notFullRoom();
        if (num >= 0) {// 数量为非负数时视为有效结果
            return Result.success(num); // 返回统计结果
        } else {
            return Result.error("-1", "空宿舍查询失败"); // 查询失败
        }
    }

    /**
     * 删除床位学生信息接口
     * @param bedName 床位名称（如"床位1"）
     * @param dormRoomId 宿舍房间ID
     * @param calCurrentNum 当前房间人数（用于更新房间人数）
     * @return 统一响应结果：成功返回操作成功，失败返回错误信息
     */
    // 映射DELETE请求到/room/delete/{bedName}/{dormRoomId}/{calCurrentNum}路径
    @DeleteMapping("/delete/{bedName}/{dormRoomId}/{calCurrentNum}")
    // 绑定三个路径参数到方法的对应参数
    public Result<?> deleteBedInfo(@PathVariable String bedName,
                                   // 床位名称参数
                                   @PathVariable Integer dormRoomId,
                                   // 房间ID参数
                                   @PathVariable int calCurrentNum) {
                                   // 当前人数参数
        // 调用服务层方法删除床位学生信息，返回受影响行数
        int i = dormRoomService.deleteBedInfo(bedName, dormRoomId, calCurrentNum);
        if (i == 1) {
            return Result.success();
        } else {
            return Result.error("-1", "删除失败");
        }
    }

    /**
     * 判断学生是否已有床位接口（查询该学生是否已分配宿舍）
     * @param value 学生标识（如学号或姓名）
     * @return 统一响应结果：成功返回空数据（未分配），失败返回错误信息（已分配）
     */
    // 映射GET请求到/room/judgeHadBed/{value}路径，{value}为学生标识参数
    @GetMapping("/judgeHadBed/{value}")
    // 绑定路径参数到方法的value参数
    public Result<?> judgeHadBed(@PathVariable String value) {
        // 调用服务层方法查询学生是否已分配宿舍，返回DormRoom对象（存在则表示已分配）
        DormRoom dormRoom = dormRoomService.judgeHadBed(value);
        if (dormRoom == null) {
            return Result.success();// 未分配，返回成功（无数据表示未分配）
        } else {
            return Result.error("-1", "该学生已有宿舍");// 已分配，返回错误信息
        }
    }

    /**
     * 主页 住宿人数
     */
    @GetMapping("/selectHaveRoomStuNum")
    public Result<?> selectHaveRoomStuNum() {
        Long count = dormRoomService.selectHaveRoomStuNum();
        if (count >= 0) {
            return Result.success(count);
        } else {
            return Result.error("-1", "查询首页住宿人数失败");
        }
    }

    /**
     * 查询首页住宿总人数接口
     * @return 统一响应结果：成功返回住宿人数，失败返回错误信息
     */
    // 映射GET请求到/room/selectHaveRoomStuNum路径
    @GetMapping("/getEachBuildingStuNum/{num}")
    public Result<?> getEachBuildingStuNum(@PathVariable int num) {
        ArrayList<Long> arrayList = new ArrayList();
        for (int i = 1; i <= num; i++) {
            Long eachBuildingStuNum = dormRoomService.getEachBuildingStuNum(i);
            arrayList.add(eachBuildingStuNum);
        }

        if (!arrayList.isEmpty()) {
            return Result.success(arrayList);
        } else {
            return Result.error("-1", "获取人数失败");
        }
    }

    /**
     * 学生功能： 我的宿舍
     */
    @GetMapping("/getMyRoom/{name}")
    public Result<?> getMyRoom(@PathVariable String name) {
        DormRoom dormRoom = dormRoomService.judgeHadBed(name);
        if (dormRoom != null) {
            return Result.success(dormRoom);
        } else {
            return Result.error("-1", "不存在该生");
        }
    }

    /**
     * 检查房间是否满员
     */
    @GetMapping("/checkRoomState/{dormRoomId}")
    public Result<?> checkRoomState(@PathVariable Integer dormRoomId) {
        DormRoom dormRoom = dormRoomService.checkRoomState(dormRoomId);
        if (dormRoom != null) {
            return Result.success(dormRoom);
        } else {
            return Result.error("-1", "该房间人满了");
        }
    }

    /**
     * 检查床位是否已经有人
     */
    @GetMapping("/checkBedState/{dormRoomId}/{bedNum}")
    public Result<?> getMyRoom(@PathVariable Integer dormRoomId, @PathVariable int bedNum) {
        DormRoom dormRoom = dormRoomService.checkBedState(dormRoomId, bedNum);
        if (dormRoom != null) {
            return Result.success(dormRoom);
        } else {
            return Result.error("-1", "该床位已有人");
        }
    }

    /**
     * 检查房间是否满员
     */
    @GetMapping("/checkRoomExist/{dormRoomId}")
    public Result<?> checkRoomExist(@PathVariable Integer dormRoomId) {
        DormRoom dormRoom = dormRoomService.checkRoomExist(dormRoomId);
        if (dormRoom != null) {
            return Result.success(dormRoom);
        } else {
            return Result.error("-1", "不存在该房间");
        }
    }
}
